Опануйте мистецтво створення Pandas DataFrame. Цей посібник охоплює ініціалізацію DataFrames з словників, списків, масивів NumPy та іншого для глобальних фахівців з даних.
Створення Pandas DataFrame: Глибокий погляд на ініціалізацію структури даних
Вітаємо у світі маніпулювання даними за допомогою Python! В основі майже кожної задачі аналізу даних лежить бібліотека Pandas, а її наріжним каменем є DataFrame. Уявіть собі DataFrame як розумну, потужну та гнучку версію електронної таблиці або таблиці бази даних, яка знаходиться прямо у вашому середовищі Python. Це основний інструмент для очищення, перетворення, аналізу та візуалізації даних. Але перш ніж ви зможете виконати будь-яку з цих магічних дій з даними, ви повинні спочатку опанувати мистецтво створення DataFrame. Те, як ви ініціалізуєте цю фундаментальну структуру даних, може закласти основу для всього вашого аналізу.
Цей вичерпний посібник розроблено для глобальної аудиторії початківців і практикуючих аналітиків даних, науковців та інженерів. Ми дослідимо найпоширеніші та найпотужніші методи створення Pandas DataFrames з нуля. Незалежно від того, чи ваші дані знаходяться у словнику, списку, масиві NumPy чи іншому форматі, ця стаття надасть вам знання та практичні приклади для ініціалізації ваших DataFrames з впевненістю та ефективністю. Давайте будувати наш фундамент.
Що таке Pandas DataFrame?
Перш ніж ми почнемо будувати, давайте з'ясуємо, що ми будуємо. Pandas DataFrame — це двовимірна, змінювана за розміром і потенційно гетерогенна таблична структура даних. Давайте розберемо це на частини:
- Двовимірна: Має рядки та стовпці, як і електронна таблиця.
- Змінювана за розміром: Ви можете додавати або видаляти рядки та стовпці після створення DataFrame.
- Гетерогенна: Стовпці можуть мати різні типи даних. Наприклад, один стовпець може містити числа (цілі або з плаваючою комою), інший може містити текст (рядки), а третій може містити дати або логічні значення (True/False).
DataFrame має три основні компоненти:
- Дані: Фактичні значення, що зберігаються в структурі, організовані в рядки та стовпці.
- Індекс: Мітки для рядків. Якщо ви не надаєте індекс, Pandas створює індекс за замовчуванням, починаючи з 0. Індекс надає потужний спосіб доступу та вирівнювання даних.
- Стовпці: Мітки для стовпців. Вони мають вирішальне значення для доступу до певних серій даних у DataFrame.
Розуміння цієї структури є ключем до розуміння того, як ефективно створювати та маніпулювати DataFrames.
Основа: Імпорт Pandas
Перш за все. Щоб використовувати Pandas, ви повинні імпортувати бібліотеку у свій скрипт Python або блокнот. Загальноприйнятою угодою, якої дотримуються професіонали в усьому світі, є імпорт її з псевдонімом pd. Цей простий псевдонім робить ваш код більш читабельним і лаконічним.
import pandas as pd
import numpy as np # Часто використовується разом з Pandas, тому ми також імпортуємо його.
За допомогою цього одного рядка ви розблокували всю потужність бібліотеки Pandas. Тепер перейдемо до суті цього посібника: створення DataFrames.
Основні методи створення: Від простого до складного
Конструктор pd.DataFrame() неймовірно універсальний. Він може приймати багато різних типів вхідних даних. Зараз ми дослідимо найважливіші методи, переходячи від найпоширеніших до більш спеціалізованих випадків.
1. Створення DataFrame зі словника списків або масивів
Це, мабуть, найпоширеніший та інтуїтивно зрозумілий метод створення DataFrame. Ви починаєте зі словника Python, де ключі стануть назвами стовпців, а значення будуть списками (або масивами NumPy або Pandas Series), що містять дані для кожного стовпця.
Як це працює: Pandas зіставляє кожен ключ словника з заголовком стовпця, а кожен список значень — з рядками цього стовпця. Тут критичною вимогою є те, що всі списки повинні мати однакову довжину, оскільки кожен список представляє повний стовпець даних.
Приклад:
Давайте створимо DataFrame, що містить інформацію про різні міста по всьому світу.
# Дані, організовані за стовпцями
city_data = {
'City': ['Tokyo', 'Delhi', 'Shanghai', 'São Paulo', 'Mumbai'],
'Country': ['Japan', 'India', 'China', 'Brazil', 'India'],
'Population_Millions': [37.3, 32.0, 28.5, 22.4, 20.9],
'Is_Coastal': [True, False, True, False, True]
}
# Створення DataFrame
df_from_dict = pd.DataFrame(city_data)
print(df_from_dict)
Вивід:
City Country Population_Millions Is_Coastal
0 Tokyo Japan 37.3 True
1 Delhi India 32.0 False
2 Shanghai China 28.5 True
3 São Paulo Brazil 22.4 False
4 Mumbai India 20.9 True
Ключовий висновок: Цей метод ідеально підходить, коли ваші дані природним чином організовані за ознакою або категорією. Він чистий, читабельний і безпосередньо перетворює структуру вашого словника в табличний формат.
2. Створення DataFrame зі списку словників
Альтернативним і не менш потужним методом є використання списку, де кожен елемент є словником. У цій структурі кожен словник представляє один рядок, а його ключі представляють назви стовпців для даних цього рядка.
Як це працює: Pandas ітерується по списку. Для кожного словника він створює новий рядок. Ключі словника використовуються для визначення стовпців. Цей метод неймовірно гнучкий, тому що, якщо у словнику відсутній ключ, Pandas автоматично заповнить цю комірку у відповідному рядку значенням NaN (Not a Number), яке є стандартним маркером для відсутніх даних у Pandas.
Приклад:
Давайте представимо ті самі дані про міста, але цього разу структуровані як список записів.
# Дані, організовані за рядками (записом)
records_data = [
{'City': 'Tokyo', 'Country': 'Japan', 'Population_Millions': 37.3, 'Is_Coastal': True},
{'City': 'Delhi', 'Country': 'India', 'Population_Millions': 32.0, 'Is_Coastal': False},
{'City': 'Shanghai', 'Country': 'China', 'Population_Millions': 28.5},
{'City': 'São Paulo', 'Country': 'Brazil', 'Population_Millions': 22.4, 'Is_Coastal': False},
{'City': 'Cairo', 'Country': 'Egypt', 'Timezone': 'EET'} # Зверніть увагу на іншу структуру
]
# Створення DataFrame
df_from_list_of_dicts = pd.DataFrame(records_data)
print(df_from_list_of_dicts)
Вивід:
City Country Population_Millions Is_Coastal Timezone
0 Tokyo Japan 37.3 True NaN
1 Delhi India 32.0 False NaN
2 Shanghai China 28.5 NaN NaN
3 São Paulo Brazil 22.4 False NaN
4 Cairo Egypt NaN NaN EET
Зверніть увагу, як Pandas елегантно обробив невідповідності. Значення 'Is_Coastal' для Shanghai дорівнює NaN, оскільки воно було відсутнє у його словнику. Для Каїра було створено новий стовпець 'Timezone', з NaN для всіх інших міст. Це робить його чудовим вибором для роботи з напівструктурованими даними, такими як відповіді JSON з API.
Ключовий висновок: Використовуйте цей метод, коли ваші дані надходять як серія записів або спостережень. Він надійний при обробці відсутніх даних і варіацій у структурі записів.
3. Створення DataFrame з масиву NumPy
Для тих, хто працює в наукових обчисленнях, машинному навчанні або будь-якій галузі, що включає важкі числові операції, дані часто походять з масивів NumPy. Pandas побудований на основі NumPy, що робить інтеграцію між ними безшовною та високоефективною.
Як це працює: Ви передаєте 2D-масив NumPy конструктору pd.DataFrame(). За замовчуванням Pandas створить індекси та стовпці на основі цілих чисел. Однак ви можете (і повинні) надати значущі мітки, використовуючи параметри index і columns.
Приклад:
Давайте створимо DataFrame зі випадково згенерованого масиву NumPy 5x4, що представляє показники датчиків з плином часу.
# Створіть масив NumPy 5x4 з випадковими даними
data_np = np.random.rand(5, 4)
# Визначте мітки стовпців та індексів
columns = ['Sensor_A', 'Sensor_B', 'Sensor_C', 'Sensor_D']
index = pd.to_datetime(['2023-10-27 10:00', '2023-10-27 10:01', '2023-10-27 10:02', '2023-10-27 10:03', '2023-10-27 10:04'])
# Створення DataFrame
df_from_numpy = pd.DataFrame(data=data_np, index=index, columns=columns)
print(df_from_numpy)
Вивід (ваші випадкові числа будуть відрізнятися):
Sensor_A Sensor_B Sensor_C Sensor_D
2023-10-27 10:00:00 0.123456 0.987654 0.555555 0.111111
2023-10-27 10:01:00 0.234567 0.876543 0.666666 0.222222
2023-10-27 10:02:00 0.345678 0.765432 0.777777 0.333333
2023-10-27 10:03:00 0.456789 0.654321 0.888888 0.444444
2023-10-27 10:04:00 0.567890 0.543210 0.999999 0.555555
У цьому прикладі ми також представили потужну функцію: використання DatetimeIndex для даних часових рядів, що відкриває величезний набір можливостей аналізу на основі часу в Pandas.
Ключовий висновок: Це найбільш ефективний за пам'яттю метод створення DataFrame з однорідних числових даних. Це стандартний вибір при взаємодії з бібліотеками, такими як NumPy, Scikit-learn або TensorFlow.
4. Створення DataFrame зі списку списків
Цей метод концептуально схожий на створення з масиву NumPy, але використовує стандартні списки Python. Це простий спосіб перетворення табличних даних, що зберігаються у форматі вкладеного списку.
Як це працює: Ви надаєте список, де кожен внутрішній список представляє рядок даних. Як і у випадку з масивами NumPy, настійно рекомендується вказати назви стовпців за допомогою параметра columns для чіткості.
Приклад:
# Дані у вигляді списку рядків
product_data = [
['P001', 'Laptop', 1200.00, 'Electronics'],
['P002', 'Mouse', 25.50, 'Electronics'],
['P003', 'Desk Chair', 150.75, 'Furniture'],
['P004', 'Keyboard', 75.00, 'Electronics']
]
# Визначте назви стовпців
column_names = ['ProductID', 'ProductName', 'Price_USD', 'Category']
# Створення DataFrame
df_from_list_of_lists = pd.DataFrame(product_data, columns=column_names)
print(df_from_list_of_lists)
Вивід:
ProductID ProductName Price_USD Category 0 P001 Laptop 1200.00 Electronics 1 P002 Mouse 25.50 Electronics 2 P003 Desk Chair 150.75 Furniture 3 P004 Keyboard 75.00 Electronics
Ключовий висновок: Це простий і ефективний метод, коли ваші дані вже структуровані як список рядків, наприклад, під час читання з файлу, який не має заголовків.
Розширена ініціалізація: Налаштування DataFrame
Окрім надання необроблених даних, конструктор pd.DataFrame() пропонує кілька параметрів для контролю структури та властивостей вашого нового DataFrame з моменту його створення.
Вказівка індексу
Ми вже бачили параметр `index` в дії. Індекс є важливою частиною DataFrame, що надає мітки для рядків, які використовуються для швидкого пошуку, вирівнювання даних тощо. Хоча Pandas надає числовий індекс за замовчуванням (0, 1, 2, ...), встановлення значущого індексу може значно полегшити роботу з вашими даними.
Приклад: Давайте повторно використаємо наш приклад зі словником списків, але встановимо стовпець `City` як індекс при створенні.
city_data = {
'Country': ['Japan', 'India', 'China', 'Brazil', 'India'],
'Population_Millions': [37.3, 32.0, 28.5, 22.4, 20.9],
'Is_Coastal': [True, False, True, False, True]
}
city_names = ['Tokyo', 'Delhi', 'Shanghai', 'São Paulo', 'Mumbai']
# Створення DataFrame з користувацьким індексом
df_with_index = pd.DataFrame(city_data, index=city_names)
print(df_with_index)
Вивід:
Country Population_Millions Is_Coastal
Tokyo Japan 37.3 True
Delhi India 32.0 False
Shanghai China 28.5 True
São Paulo Brazil 22.4 False
Mumbai India 20.9 True
Тепер ви можете отримати доступ до даних рядка, використовуючи ці значущі мітки, наприклад, за допомогою df_with_index.loc['Tokyo'].
Контроль типів даних (`dtype`)
Pandas досить добре визначає типи даних (наприклад, розпізнає числа, текст і логічні значення). Однак іноді вам потрібно примусово застосувати певний тип даних для стовпця, щоб забезпечити ефективність пам'яті або ввімкнути певні операції. Параметр `dtype` надає вам цей контроль.
Приклад: Уявіть, що у нас є ідентифікатори продуктів, які виглядають як числа, але повинні розглядатися як текст (рядки).
data = {
'ProductID': [101, 102, 103],
'Stock': [50, 75, 0]
}
# Створення DataFrame, вказуючи dtype для 'ProductID'
df_types = pd.DataFrame(data, dtype={'ProductID': str, 'Stock': 'int32'})
print(df_types.dtypes)
Вивід:
ProductID object Stock int32 dtype: object
Зверніть увагу, що `str` у Pandas представлено як `object`. Явно встановивши `dtype`, ми запобігаємо тому, що Pandas розглядає `ProductID` як число, що може призвести до неправильних обчислень або проблем із сортуванням у майбутньому. Використання більш конкретних цілочисельних типів, таких як `int32`, замість `int64` за замовчуванням, також може заощадити значну кількість пам'яті з великими наборами даних.
Практичні сценарії та найкращі практики
Вибір правильного методу створення залежить від початкового формату ваших даних. Ось простий посібник з прийняття рішень:
- Чи ваші дані у стовпцях (наприклад, один список на ознаку)? Використовуйте словник списків. Це природний вибір.
- Чи ваші дані є серією записів (наприклад, з JSON API)? Використовуйте список словників. Він чудово обробляє відсутні або додаткові поля в записах.
- Чи ваші дані числові та в сітці (наприклад, з наукових обчислень)? Використовуйте масив NumPy. Це найбільш продуктивний варіант для цього випадку використання.
- Чи ваші дані у простому табличному форматі рядок за рядком без заголовків? Використовуйте список списків і надайте назви стовпців окремо.
Поширені помилки, яких слід уникати
- Нерівна довжина у словнику списків: Це поширена помилка. Під час створення DataFrame зі словника списків кожен список повинен мати точно однакову кількість елементів. Якщо ні, Pandas викличе `ValueError`. Завжди переконайтеся, що дані ваших стовпців мають однакову довжину перед створенням.
- Ігнорування індексу: Покладатися на індекс на основі 0 за замовчуванням підходить для багатьох випадків, але якщо ваші дані мають природний ідентифікатор (наприклад, ідентифікатор продукту, ідентифікатор користувача або певний часовий штамп), встановлення його як індексу з самого початку може спростити ваш код пізніше.
- Забування про типи даних: Нехай Pandas визначає типи, працює більшість часу, але для великих наборів даних або стовпців зі змішаними типами продуктивність може постраждати. Будьте активними щодо встановлення `dtype` для стовпців, які потрібно розглядати як категорії, рядки або певні числові типи, щоб заощадити пам'ять і запобігти помилкам.
За межами ініціалізації: Створення DataFrames з файлів
Хоча цей посібник зосереджується на створенні DataFrames з об'єктів Python в пам'яті, важливо знати, що в більшості реальних сценаріїв ваші дані надходитимуть із зовнішнього файлу. Pandas надає набір високоефективних функцій зчитування для цієї мети, зокрема:
pd.read_csv(): Для файлів зі значеннями, розділеними комами, основний інструмент імпорту даних.pd.read_excel(): Для читання даних із електронних таблиць Microsoft Excel.pd.read_json(): Для читання даних із файлів JSON або рядків.pd.read_sql(): Для читання результатів запиту до бази даних безпосередньо в DataFrame.pd.read_parquet(): Для читання з ефективного, орієнтованого на стовпці формату файлу Parquet.
Ці функції є наступним логічним кроком у вашій подорожі Pandas. Освоївши їх, ви зможете приймати дані практично з будь-якого джерела в потужну структуру DataFrame.
Висновок: Ваш фундамент для опанування даних
Pandas DataFrame — це центральна структура даних для будь-якої серйозної роботи з даними в Python. Як ми побачили, Pandas пропонує гнучкий та інтуїтивно зрозумілий набір інструментів для ініціалізації цих структур із широкого спектру форматів. Розуміючи, як створити DataFrame зі словників, списків та масивів NumPy, ви створили міцну основу для своїх проектів аналізу даних.
Ключ полягає у виборі методу, який найкраще відповідає початковій структурі ваших даних. Це не тільки робить ваш код чистішим і читабельнішим, але й більш ефективним. Звідси ви готові перейти до захоплюючих завдань очищення, дослідження, перетворення та візуалізації даних. Щасливого кодування!